#include <iostream>
using namespace std;

struct Base {
  Base() { cout << "Base::Ctor" << endl; }
  Base(const Base&) { cout << "Base::Copy" << endl; }
  Base& operator=(const Base&) { cout << "Base::operator=" << endl; return *this; }
  virtual void foo() { cout << "Base::foo()" << endl; }
};

struct Derived : public Base {
  Derived() { cout << "Derived::Ctor" << endl; }
  void foo() { cout << "Derived::foo()" << endl; }
};

void test(Base* pb, Base& rb, Base b){
  // 传址和引用无需创建新对象。参数b传值要调用拷贝构造函数创建新对象。
  pb->foo(); // 通过指针调用，多态行为，动态调用。
  rb.foo();  // 通过指针调用，多态行为，动态调用。
  b.foo();   // 静态调用基类的成员函数。
}

int main() {
  Derived d;
  cout << "############" << endl;
  test(&d, d, d);
  cout << "############" << endl;
  Base b = d; // 形式上是赋值，实际是创建对象，类似b(d)或b{d}，调用拷贝构造函数。
  b = d;      // 这次才是赋值，调用拷贝赋值算符。也会导致切割（slicing）
}
